/**
 * Software License, Version 1.0
 * 
 * Copyright 2003 The Trustees of Indiana University.  All rights reserved.
 * 
 *
 *Redistribution and use in source and binary forms, with or without 
 *modification, are permitted provided that the following conditions are met:
 *
 *1) All redistributions of source code must retain the above copyright notice,
 * the list of authors in the original source code, this list of conditions and
 * the disclaimer listed in this license;
 *2) All redistributions in binary form must reproduce the above copyright 
 * notice, this list of conditions and the disclaimer listed in this license in
 * the documentation and/or other materials provided with the distribution;
 *3) Any documentation included with all redistributions must include the 
 * following acknowledgement:
 *
 *"This product includes software developed by the Community Grids Lab. For 
 * further information contact the Community Grids Lab at 
 * http://communitygrids.iu.edu/."
 *
 * Alternatively, this acknowledgement may appear in the software itself, and 
 * wherever such third-party acknowledgments normally appear.
 * 
 *4) The name Indiana University or Community Grids Lab or NaradaBrokering, 
 * shall not be used to endorse or promote products derived from this software 
 * without prior written permission from Indiana University.  For written 
 * permission, please contact the Advanced Research and Technology Institute 
 * ("ARTI") at 351 West 10th Street, Indianapolis, Indiana 46202.
 *5) Products derived from this software may not be called NaradaBrokering, 
 * nor may Indiana University or Community Grids Lab or NaradaBrokering appear
 * in their name, without prior written permission of ARTI.
 * 
 *
 * Indiana University provides no reassurances that the source code provided 
 * does not infringe the patent or any other intellectual property rights of 
 * any other entity.  Indiana University disclaims any liability to any 
 * recipient for claims brought by any other entity based on infringement of 
 * intellectual property rights or otherwise.  
 *
 *LICENSEE UNDERSTANDS THAT SOFTWARE IS PROVIDED "AS IS" FOR WHICH NO 
 *WARRANTIES AS TO CAPABILITIES OR ACCURACY ARE MADE. INDIANA UNIVERSITY GIVES
 *NO WARRANTIES AND MAKES NO REPRESENTATION THAT SOFTWARE IS FREE OF 
 *INFRINGEMENT OF THIRD PARTY PATENT, COPYRIGHT, OR OTHER PROPRIETARY RIGHTS. 
 *INDIANA UNIVERSITY MAKES NO WARRANTIES THAT SOFTWARE IS FREE FROM "BUGS", 
 *"VIRUSES", "TROJAN HORSES", "TRAP DOORS", "WORMS", OR OTHER HARMFUL CODE.  
 *LICENSEE ASSUMES THE ENTIRE RISK AS TO THE PERFORMANCE OF SOFTWARE AND/OR 
 *ASSOCIATED MATERIALS, AND TO THE PERFORMANCE AND VALIDITY OF INFORMATION 
 *GENERATED USING SOFTWARE.
 */
package cgl.narada.discovery.broker.messages;

import java.io.IOException;
import java.io.Serializable;

import org.apache.log4j.Logger;

import cgl.narada.service.ServiceException;
import cgl.narada.service.time.TimeService;
import cgl.narada.service.time.ntptime.TimeServiceImpl;
import cgl.narada.util.ObjectMarshaller;

/**
 * Created on Mar 26, 2005
 * 
 * @author Harshawardhan Gadgil (hgadgil@grids.ucs.indiana.edu)
 */

public class BrokerDiscoveryResponse implements Serializable {

   static Logger log = Logger.getLogger("BrokerDiscoveryResponse");

   /** The UUID of request !! */
   private String requestUUID;

   /** They share similar data, so pretty much an alias */
   public BrokerAdvertisement brokerInfo;

   /** NTP Timestamp for this response */
   long timeStamp;

   /** Number of active concurrent Connections */
   int numLinks;

   /** Amount of memory used by this broker (probably a measure of broker load) */
   double totalmemory, freeMemory;

   /** I belong to this network */
   String networkName;

   public BrokerDiscoveryResponse(String _UUID) {
      requestUUID = _UUID; // Necessary field, so make RO

      TimeService tsi = TimeServiceImpl.getInstance();
      try {
         timeStamp = tsi.getTimestamp();
      } catch (ServiceException e) {

         System.out
                  .println("ERROR: Could not get Time Stamp from NtpTimeService\n"
                           + e);

         // Some default value as of now...
         timeStamp = System.currentTimeMillis();
      }

      Runtime rt = Runtime.getRuntime();
      totalmemory = rt.totalMemory();
      freeMemory = rt.freeMemory();
   }

   /**
    * Marshalls the object into an array of bytes.
    * 
    * @return an array of bytes representing the marshaller object, null if
    *         error occurs
    */
   public byte[] getBytes() {
      try {
         return ObjectMarshaller.marshall(this);
      } catch (IOException e) {
         log.error("", e);
         return null;
      }
   }

   /**
    * Unmarshalls the bytes as a BrokerDiscoveryResponse object
    * 
    * @param objectBytes
    * @return BrokerDiscoveryResponse if successful, null if error occurs
    */
   public static BrokerDiscoveryResponse createObjectFromBytes(
            byte[] objectBytes) {
      try {
         return (BrokerDiscoveryResponse) ObjectMarshaller
                  .unmarshall(objectBytes);
      } catch (IOException e) {
         log.error("", e);
      } catch (ClassNotFoundException e) {
         log.error("", e);
      }
      return null;
   }

   /**
    * For debugging purposes
    */
   public String toString() {
      StringBuffer result = new StringBuffer();

      result.append("UUID : " + requestUUID + "\n");
      result.append("TIME : " + timeStamp + "\n");
      result.append("LINKS: " + numLinks + "\n");
      result.append("Tmem : " + totalmemory + "\n");
      result.append("Fmem : " + freeMemory + "\n");
      result.append("NTWK : " + networkName + "\n");
      result.append(brokerInfo.toString());

      return result.toString();
   }

   /**
    * @return Returns the networkName.
    */
   public final String getNetworkName() {
      return networkName;
   }

   /**
    * @param networkName
    *           The networkName to set.
    */
   public final void setNetworkName(String networkName) {
      this.networkName = networkName;
   }

   /**
    * @return Returns the freeMemory.
    */
   public final double getFreeMemory() {
      return freeMemory;
   }

   /**
    * @return Returns the timeStamp.
    */
   public final long getTimeStamp() {
      return timeStamp;
   }

   /**
    * @return Returns the totalmemory.
    */
   public final double getTotalmemory() {
      return totalmemory;
   }

   /**
    * @return Returns the brokerInfo.
    */
   public final BrokerAdvertisement getBrokerInfo() {
      return brokerInfo;
   }

   /**
    * @param brokerInfo
    *           The brokerInfo to set.
    */
   public final void setBrokerInfo(BrokerAdvertisement brokerInfo) {
      this.brokerInfo = brokerInfo;
   }

   /**
    * @return Returns the numLinks.
    */
   public final int getNumLinks() {
      return numLinks;
   }

   /**
    * @param numLinks
    *           The numLinks to set.
    */
   public final void setNumLinks(int numLinks) {
      this.numLinks = numLinks;
   }

   /**
    * @return Returns the requestUUID.
    */
   public final String getRequestUUID() {
      return requestUUID;
   }
}